package modelo;

import java.util.ArrayList;
import java.util.Iterator;

import titiritero.Dibujable;
import utilitarios.*;
import vistas.VistaProyectil;

public class Proyectil extends ObjetoDinamico {
	
	private int danio;
		
	public Proyectil(Escenario escenario, PuntoXY posicionInicial) {
		super(escenario);
		this.figura = (new Circulo(TAMANIO_PIXEL / 2.0));
		this.getFigura().setCentroMasa(posicionInicial);
		this.direccion = new DireccionNula();
		this.danio = 1;
		this.resistencia = 1;
		this.velocidadMovimiento = 1;
	}
	
	protected void setVelocidad(double velocidad) {
		this.velocidadMovimiento = velocidad;
	}
	
	protected void setDanio(int danio) {
		this.danio = danio;
	}
	
	protected void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}
	
	public int getDanio() {
		return this.danio;
	}
	
	@Override
    public void moverEnDireccion(Direccion direccion) {
		PuntoXY centroViejo = this.figura.getCentroMasa();
		PuntoXY centroNuevo = centroViejo.sumarDireccion(direccion);
		
		this.figura.setCentroMasa(centroNuevo); 
		if (!this.escenario.permiteMovimiento(this)) {
		    this.detener();
		    this.morir();
		}
		else {
		    @SuppressWarnings("unchecked")
            ArrayList<Objeto> objetos = (ArrayList<Objeto>) this.escenario.getObjetos().clone();
    		Iterator<Objeto> iterador = objetos.iterator();
    		while (iterador.hasNext() && !this.debeMorir()) {
    			Objeto objeto = iterador.next();
    			if ((!this.equals(objeto)) && (this.figura.estaSolapadoCon(objeto.getFigura()))) {
    				objeto.chocarConProyectil(this);
    				return;
    				}
    			}
		}
			
	}

	@Override
    public void vivir() {
		if (this.estaMoviendose) {
			for (double i = 1.0; i <= this.velocidadMovimiento; i++) {
				this.moverEnDireccion(this.direccion);
				}
		}
	}


	@Override
    protected void morir() {
		this.resistencia = 0;
		this.escenario.eliminarObjeto(this);
	}
	
	public void daniar(Objeto vecino, Escenario escenario) {
		vecino.recibirDanio(this.danio);
	}	

	@Override
    public void chocarConAlgoTank(TanqueAlgo unTanque) {
		unTanque.chocarConProyectil(this);
		this.detener();
		this.morir();
	}
	
	@Override
    public void chocarConTanqueEnemigo(TanqueEnemigo unTanque) {
		unTanque.chocarConProyectil(this);
		this.detener();
		this.morir();
	}

	@Override
    public void chocarConProyectil(Proyectil unProyectil) {
		this.detener();
		unProyectil.detener();
		unProyectil.morir();
		this.morir();		
	}

	@Override
    public void chocarConPared(Pared unaPared) {
		this.detener();
		this.morir();
	}

	public void chocarConBonus(Bonus bonus) {
	}

	public void chocarConArma(Arma arma) {
	}

	public void chocarConCuartel(Cuartel cuartel) {
		this.detener();
		this.morir();
	}

	@Override
    public Dibujable crearDibujable() {
		VistaProyectil vistaProyectil = new VistaProyectil();
		vistaProyectil.setPosicionable(this);
		return vistaProyectil;
	}

}
